// 之前那种方法 axios 要导入vue是因为要在vue原型上挂载 axios
// 这种方法没用到vue因此不需要导入
import axios from 'axios'
import { Toast } from 'vant'
import { getToken, removeToken } from '../utils/token'
import store from '../store/index'

// Toast===this.$toast
import router from '../router/index'
// 全局挂载的路由只能在vue实例 也就是项目所有的vue组件中使用 在vue文件中使用 this.$router (前面要加$ 其实就是挂载到vue原型上
// Vue.protype.$router=routervue中 挂载到原型上一般喜欢用$开头作为属性名)
// js文件想要用router的话 必须 导入router用的时候直接router就行  store也是
// 此时router===this.$router
const _fetch = axios.create({
  baseURL: process.env.VUE_APP_URL
})

// 请求拦截器
_fetch.interceptors.request.use(
  function (config) {
    // window.console.log(config, '-----')
    // window.console.log('---------------------')
    // 黑马移动端项目 有的接口需要token有的不需要 config里有请求相关所有 信息
    // window.console.log(config)
    // window.console.log('---------------------')

    if (config.needToken) {
      config.headers.authorization = `Bearer ${getToken('token')}`
    }
    return config
  },
  function (error) {
    return Promise.reject(error)
  }
)
// 响应拦截器
_fetch.interceptors.response.use(
  function (res) {
    window.console.log('验证响应拦截器:', res)
    if (res.data.code === 200) {
      return res
    } else if (res.config.noError) {
      // 删除token
      removeToken('token')
      // 终止 .then 直接跳转到.catch执行
      return Promise.reject(new Error('不需要处理错误的调用'))
    } else if (res.data.code === 401 || res.data.code === 403) {
      // 401  403表示token有问题 过期失效等等
      // 提示
      Toast.fail(res.data.message)
      // 删除token(token有问题 就删除啦)
      removeToken('token')
      // 登入状态改成false
      store.state.isLogin = false
      // 跳转到登入页
      const url = window.location.href.split('#')[1]
      console.log(url)

      router.push('/login?redirect=' + url)
      // 返回这个 抛出错误 执行catch  不让他进then方法
      return Promise.reject(new Error(res.data.message))
    } else {
      // return undefined
      // this.$toast.fail()
      Toast.fail(res.data.message)
      // 这里eslint规范最好在(res.data.message) 前面加上new Error 规范点
      // 下面return Promise.reject(error)    error前面new Error 因为内部其实加了封装好了这样记就行
      // 没加就是内部弄好啦
      // else里面也可以进then方法 发送请求了只是请求到 因此加上下面这句 抛出错误  那样就不会执行then啦 执行catch啦
      // 因此请求then方法里面一定是请求到的 你可以将token改错然后在then方法里面打印一个东西 发现可以打印也可以说明
      // code非200 else语句会进then方法
      return Promise.reject(new Error(res.data.message))
    }
  },
  function (error) {
    return Promise.reject(error)
  }
)
// 默认导出只能导出一个
export default _fetch
// 按需导出能导出多个
